Tests se conectan con la base de datos

Actualización

Despues de hacer algunas comprobaciones resulta que el error no proviene directamente de la anotación SpringBootTest, el problema se produce al usar esa anotación con la siguiente dependencia:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Está dependencía permite autoconfigurar el EntityManager y tambien es la que hace la autoconfiguración de datasource asi que al usarla en conjunto con la anotación de SpringBootTest hace que se produzca el intento de conexión con la base de datos

Para resolverlo se puede usar la solución que se explica abajo en está página usando el ExtendWith, pero tambien podemos utilizar una configuración alternativa con la etiqueta SpringBootTest de la siguiente manera:

Primero en el application.properties de los tests indicamos la siguiente linea de configuración

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

A continuación en la etiqueta SpringBootTest indicamos con la opcion classes las clases que necesita el test para poder ser compilado, de igual manera que se hace la configuración con el ExtendWith (las clases dependientes son las mismas en los dos casos):

Descripcion

Al lanzar los tests unitarios se intenta hacer una conexion con la base de datos, lo cual no debería de ocurrir en test unitarios

2022-02-20 17:01:31.819  WARN 13520 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during
              context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean
              with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor
              parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined
              in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory
              method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate
              [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is
              org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
2022-02-20 17:01:31.834  INFO 13520 --- [           main] ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-02-20 17:01:31.869 ERROR 13520 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   :

***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class


Action:

Consider the following:
        If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
        If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

El Application context que ejecuta los test intenta configurar un dataSource (en este caso una conexion a la base de datos) y falla al no encontrar ninguna configuración valida, en este caso como estamos probando test unitarios ni siquiera se debería de producir ese intento de conexión.

Solución

Esta situación se produce porque estamos utilizando la etiqueta @SpringBootTest para la configuración de los test, está etiqueta debería de utilizarse para test de integración en los que si se tiene que utilizar una base de datos, pero no para test unitarios

La anotación que tenemos que utilizar es @ExtendWith(SpringExtension.class), y a mayores tenemos que configurar el test para que cargue las clases de las que tiene dependencias, esto lo hacemos dentro del test con la etiqueta @Configuration, y despues con la etiqueta @Bean para cargar las clases, el código solucionado quedaría así:

Para saber cuales son las clases que tenemos que añadir en la configuración podemos verlo al ejecutar los tests y observar el fallo que se nos muestra:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name
'main.services.memberProfileServiceTests.DeleteMemberTests': Unsatisfied dependency expressed through field 'memberProfileService'; nested
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'main.services.MemberProfileService'
available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
No qualifying bean of type 'main.services.MemberProfileService' available
Tags

Spring | test | Base de datos | datasource | app context